#ifndef SYSTEM_HPP
#define SYSTEM_HPP

#include "card.hpp"
#include "threadpool.hpp"
#include <vector>
#include <string>
#include <shared_mutex>	// 读写锁

class System
{
private:
	Threadpool<void> &threadPool;
	std::vector<Card> cards;
	// 加一个读写锁更安全
	mutable std::shared_mutex cardMutex;
public:
	System(Threadpool<void> &threadPool);
	~System();

	// 对外接口

	// 数据生命周期要注意
	void loadData();												// 带文件异常处理
	void saveData() noexcept;										// 原子化保存

	// 用户操作接口
	void addCard(const Card &card);
	Card* findCard(const std::string &cardNum);
	// 带异步的接口
	void consumeCard(const std::string &cardNum, double amount);
	void rechargeCard(const std::string &cardNum, double amount);
	// 带同步的接口
	void reportLostCard(const std::string &cardNum);
	void deleteCard(const std::string &cardNum);
	void listAllCards();
	void run();

	// 更加优雅 枚举和menu函数
	enum {
		add = 1,			// 添加
		consume = 2,		// 消费
		recharge = 3,		// 充值
		reportLost = 4,		// 挂失
		delete_card = 5,	// 删除饭卡
		find_list = 6,		// 查询
		exiting = 7			// 退出
	};

	void menu() const {
		std::cout << "======================饭卡管理系统======================" << std::endl;
		std::cout << "=*********************1.  添加饭卡*********************=" << std::endl;
		std::cout << "=*********************2.     消费*********************=" << std::endl;
		std::cout << "=*********************3.     充值*********************=" << std::endl;
		std::cout << "=*********************4.     挂失*********************=" << std::endl;
		std::cout << "=*********************5.  删除饭卡*********************=" << std::endl;
		std::cout << "=*********************6.  查询饭卡*********************=" << std::endl;
		std::cout << "=*********************7.  退出系统*********************=" << std::endl;
		std::cout << "======================饭卡管理系统======================" << std::endl;
	}
};

#endif